package main

import (
	"bufio"
	"fmt"
	"io"
	"os"
	"strings"
)

func main() {
	fmt.Println("请输入要寻找的路径:")
	var path string
	fmt.Scan(&path) // 获取用户输入的路径

	dir, _ := os.OpenFile(path, os.O_RDONLY, os.ModeDir) // 只读打开该目录

	defer dir.Close() // 打开后要记得关闭

	names, _ := dir.Readdir(-1) // 读取当前目录下所有的文件名和目录名，存入names切片中

	var AllLove int = 0

	for _, name := range names {
		if !name.IsDir() {
			s := name.Name()
			if strings.HasSuffix(s, ".txt") {
				AllLove += readFile(path + s) // 拼接有路径的文件名（绝对路径）
			}
		}
	}

	fmt.Printf("路径中所有文件共有 %d 个Love\n", AllLove)
}

func readFile(fileName string) int {
	fp, err := os.Open(fileName)
	if err != nil {
		fmt.Println("Open err:", err)
		return -1
	}
	defer fp.Close()

	row := bufio.NewReader(fp) // 创建一个reader
	var total int = 0          // 统计Love的个数

	for { // 循环，按行读取文件内容，存入buf中
		buf, err := row.ReadBytes('\n')
		if err != nil && err == io.EOF {
			break
		}
		// 交给 wordCount统计每行中Love出现的次数，累加各行love数
		total += wordCount(string(buf[:]))
	}

	return total
}

func wordCount(s string) int {
	arr := strings.Fields(s)
	m := make(map[string]int)

	// 以单词为key，记录每个单词出现的次数，单词每出现一次对应的value加一
	for i := 0; i < len(arr); i++ {
		m[arr[i]]++
	}

	// 统计 map 中一共有多少个 “Love”
	for k, v := range m {
		if k == "love" {
			fmt.Printf("%s : %d \n", k, v)
			return m[k] // 返回Love出现的次数
		}
	}

	return 0
}
